x86-64 linux: properly exit idle mode from evtchn_do_upcall()
authorcl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Wed, 8 Feb 2006 15:36:49 +0000 (15:36 +0000)
committercl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Wed, 8 Feb 2006 15:36:49 +0000 (15:36 +0000)
Add a call to exit_idle() when evtchn_do_upcall() calls
evtchn_device_upcall() instead of do_IRQ().

From: Jan Beulich <JBeulich@novell.com>
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
linux-2.6-xen-sparse/drivers/xen/core/evtchn.c

index 5779185e83d93dc070f3111fe4203016103a941e..d27b0b625f8c69e8e8e55b9de96616149be80fdf 100644 (file)
@@ -123,8 +123,10 @@ static void init_evtchn_cpu_bindings(void)
 #ifdef CONFIG_X86
 extern fastcall unsigned int do_IRQ(struct pt_regs *regs);
 #if defined (__i386__)
+static inline void exit_idle(void) {}
 #define IRQ_REG orig_eax
 #elif defined (__x86_64__)
+#include <asm/idle.h>
 #define IRQ_REG orig_rax
 #endif
 #define do_IRQ(irq, regs) do {                 \
@@ -170,8 +172,10 @@ asmlinkage void evtchn_do_upcall(struct pt_regs *regs)
                        port = (l1i * BITS_PER_LONG) + l2i;
                        if ((irq = evtchn_to_irq[port]) != -1)
                                do_IRQ(irq, regs);
-                       else
+                       else {
+                               exit_idle();
                                evtchn_device_upcall(port);
+                       }
                }
        }
 }